﻿// -------------------------------------------------------------------------
//    @FileName         :    NFItemUseFactory.h
//    @Author           :    Gao.Yi
//    @Date             :    2025-10-24
//    @Email			:    445267987@qq.com
//    @Module           :    NFItemUseFactory
//    @Desc             :
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// `NFItemUseFactory` 是物品使用工厂类：
// - 单例模式，管理所有物品类型的使用处理器
// - 根据物品类型分发到对应的使用处理函数
// - 支持道具、宝箱、品质物品、Buff物品等多种类型
// ---------------------------------------------------------------------------

#pragma once

#include "E_ItemData.nanopb.h"
#include "proto_cs.pb.h"
#include "NFComm/NFObjCommon/NFObject.h"

class NFPlayer;

/** @brief 物品使用处理器函数类型 */
typedef std::function<int(NFPlayer* pPlayer, const proto_ff::Proto_CSUseItemReq& oUseItemReq, const E_Item* pstItemDesc, proto_ff::Proto_CSUseItemRsp* pResult, bool bNeedCheckCD)> NFUseItemHandler;

/**
 * @brief 物品使用工厂类（单例）
 * 管理所有物品类型的使用处理器，根据物品类型分发到对应的处理函数
 */
class NFItemUseFactory : public NFSingleton<NFItemUseFactory>
{
public:
    /**
     * @brief 构造函数
     */
    NFItemUseFactory();
    
    /**
     * @brief 析构函数
     */
    ~NFItemUseFactory() override;

private:
    /**
     * @brief 注册所有物品使用处理器
     * @return 0成功，非0失败
     */
    int RegisterAll();
public:
    /**
     * @brief 根据物品类型获取对应的使用处理器
     * @param itemType 物品类型
     * @return 使用处理器函数
     */
    NFUseItemHandler GetHandler(int itemType);
public:
    /**
     * @brief 道具物品使用处理器
     */
    static int PropItemUseHandler(NFPlayer* pPlayer, const proto_ff::Proto_CSUseItemReq& oUseItemReq, const E_Item* pstItemDesc, proto_ff::Proto_CSUseItemRsp* pResult, bool bNeedCheckCD);
    
    /**
     * @brief 宝箱物品使用处理器
     */
    static int BoxItemUseHandler(NFPlayer* pPlayer, const proto_ff::Proto_CSUseItemReq& oUseItemReq, const E_Item* pstItemDesc, proto_ff::Proto_CSUseItemRsp* pResult, bool bNeedCheckCD);
    
    /**
     * @brief 品质物品使用处理器
     */
    static int QualityItemUseHandler(NFPlayer* pPlayer, const proto_ff::Proto_CSUseItemReq& oUseItemReq, const E_Item* pstItemDesc, proto_ff::Proto_CSUseItemRsp* pResult, bool bNeedCheckCD);
    
    /**
     * @brief 添加Buff物品使用处理器
     */
    static int AddBuffItemUseHandler(NFPlayer* pPlayer, const proto_ff::Proto_CSUseItemReq& oUseItemReq, const E_Item* pstItemDesc, proto_ff::Proto_CSUseItemRsp* pResult, bool bNeedCheckCD);
public:
    /** @brief 物品使用处理器数组（按物品类型索引） */
    NFUseItemHandler m_apItemUseHandle[proto_ff::enItemType_ARRAYSIZE];
};
